const { match } = require("path-to-regexp");
const whiteList = ["/login"];
const codeMatch = match("/code/:mobile", { decode: decodeURIComponent });

module.exports = () => {
    // 返回一个 Koa 中间件
    return async (ctx, next) => {
        // 如果不是在白名单中
        if (!whiteList.includes(ctx.path) && !codeMatch(ctx.path)) {
            // 检查是否存在 token
            const token = ctx.headers.token;
            // 如果不存在，直接返回
            if (!token) {
                ctx.body = {
                    code: 401,
                    message: "token 不存在，无法认证",
                };
                return;
            }

            // 解析 token
            try {
                // 校验并解析 token 信息
                const user = ctx.helper.checkToken(token);
                // 挂载到 ctx 上，以便 controller、service 中使用
                ctx.user = user;
            } catch (error) {
                if (error.name === "JsonWebTokenError") {
                    this.ctx.body = {
                        code: 401,
                        message: "无效的 token",
                    };
                    return;
                }

                if (error.name === "TokenExpiredError") {
                    this.ctx.body = {
                        code: 401,
                        message: "token 已过期，请重新获取",
                    };
                    return;
                }
            }
        }

        // 向下走
        await next();
    };
};
